<?php

class ListadoController extends Zend_Controller_Action {

    public function init() {
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {
        X\Permiso::paraAction('Listar.Marcaciones');
        $user = X\Session::getIdUsuario();

        $profesores = $this->em->createQueryBuilder()
                        ->select('p.idProfesor')
                        ->addselect('p.codigoTarjeta')
                        ->addselect('u.nombre')
                        ->addselect('u.apellido')
                        ->from('Default_Model_Profesor', 'p')
                        ->join('p.usuario', 'u')
                        //->where("u.idUsuario='" . $user . "'")
                        ->orderBy('u.apellido', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->profesores = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($profesores),
                    "rows" => $profesores
                ));
    }

    public function ajaxCrearAction() {
        X\Permiso::paraAction('Crear.Marcaciones');
        $profesor = $this->_request->getPost('profesor');
        $desde = $this->_request->getPost('desde');
        $hasta = $this->_request->getPost('hasta');

        $infoProfesor = $this->em->createQueryBuilder()
                        ->select('u.nombre')
                        ->addselect('u.apellido')
                        ->from('Default_Model_Profesor', 'p')
                        ->join('p.usuario', 'u')
                        ->where("p.codigoTarjeta='" . $profesor . "'")
                        ->getQuery()
                        ->execute();

        $nombreProf = $infoProfesor[0]['nombre'];
        $apellidoProf = $infoProfesor[0]['apellido'];

        $nombreProfesor = $apellidoProf . ', ' . $nombreProf;

        //crear QueryBuilder
        $qb = $this->em->createQueryBuilder();

        $marcaciones = $qb->select('h.fecha')
                        ->addSelect('h.tipo')
                        ->addSelect('h.entrada_salida')
                        ->from('Default_Model_HorarioDia', 'h')
                        ->where("h.id_empleado='" . $profesor . "'")
                        ->andWhere($qb->expr()->between('h.fecha', "'" . $desde . "'", "'" . $hasta . "'"))
                        ->getQuery()
                        ->execute();
        //X\Msg::Failure('El reporte se ha generado con Exito.'.count($marcaciones));return;

        //Variables auxiliares y de control
        $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
        $dataSet = array();
        list($date, $month, $year) = explode("/", $desde);
        $fechaAux = $year . "-" . $month . "-" . $date;
        $fechaActual = date('Y-m-d', strtotime($fechaAux) - 86400);
        $marcaEntrada = false;
        $marcaSalida = false;

        // Aqui algoritmo de pre-procesamiento para listado
        foreach ($marcaciones as $marca) {
            $fechaDeUso = $marca['fecha']->format('d-m-Y');
            $horaDeUso = $marca['entrada_salida']->format('H:i:s');
            //Marcacion en un mismo dia, luego de marcar salida
            if ($marca['fecha'] == $fechaActual) {
                if ($marcaSalida) {
                    //Si es salida, se actualiza la hora de salida
                    if ($marca['tipo'] == 'SALIDA') {
                        $data['salida'] = $horaDeUso;
                    } else { //Si es entrada, se agrega la marcacion anterior y se inicializa una nueva
                        array_push($dataSet, $data);
                        $marcaSalida = false;
                        unset($data);
                        $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
                        $data['fecha'] = $fechaActual;
                        $data['dia'] = date('N', strtotime($fechaDeUso));
                        $data['entrada'] = $horaDeUso;
                        $marcaEntrada = true;
                    }
                } elseif (!$marcaEntrada) {
                    if ($marca['tipo'] == 'ENTRADA') {
                        $marcaSalida = false;
                        unset($data);
                        $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
                        $data['fecha'] = $fechaActual;
                        $data['dia'] = date('N', strtotime($fechaDeUso));
                        $data['entrada'] = $horaDeUso;
                        $marcaEntrada = true;
                    }
                    if ($marca['tipo'] == 'SALIDA') {
                        unset($data);
                        $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
                        $data['fecha'] = $fechaActual;
                        $data['dia'] = date('N', strtotime($fechaDeUso));
                        $data['salida'] = $horaDeUso;
                        $data['obs'] = "Entrada no marcada";
                        array_push($dataSet, $data);
                    }
                }
            }
            //Nuevo dia
            if ($marca['fecha'] != $fechaActual) {
                //La salida del dia anterior fue la ultima, se agrega la marcacion
                if ($marcaEntrada) {
                    if ($marcaSalida) {
                        array_push($dataSet, $data);
                        $marcaSalida = false;
                    } else {
                        $data['obs'] = "Salida no marcada";
                        array_push($dataSet, $data);
                    }
                }
                $marcaEntrada = false;
                $fechaActual = $marca['fecha'];
                if ($marca['tipo'] == 'ENTRADA') {
                    unset($data);
                    $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
                    $data['fecha'] = $fechaActual;
                    $data['dia'] = date('N', strtotime($fechaDeUso));
                    $data['entrada'] = $horaDeUso;
                    $marcaEntrada = true;
                }
                if ($marca['tipo'] == 'SALIDA') {
                    unset($data);
                    $data = array('fecha' => '', 'dia' => '', 'entrada' => '', 'salida' => '', 'obs' => '');
                    $data['fecha'] = $fechaActual;
                    $data['dia'] = date('N', strtotime($fechaDeUso));
                    $data['salida'] = $horaDeUso;
                    $data['obs'] = "Entrada no marcada";
                    array_push($dataSet, $data);
                }
            }
            //Marcacion de salida, puede no ser la ultima
            if ($marca['fecha'] == $fechaActual && $marca['tipo'] == 'SALIDA' && $marcaEntrada) {
                $data['salida'] = $horaDeUso;
                $marcaSalida = true;
            }
        }
        //Se agrega la ultima marcacion correcta
        if ($marcaEntrada && $marcaSalida) {
            array_push($dataSet, $data);
        }

        //Generar pdf con marcaciones y sus observaciones */
        //Crear PDF
        $pdf = new Zend_Pdf();
        //Crear pagina
        $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4); //':595:842'
        //Definir fuentes
        $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
        $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

        $page->setFont($font2, 10)
                ->drawText('LISTADO DE MARCACIONES', 40, 800)
                ->drawText('Docente', 40, 785)
                ->drawText('Desde', 40, 770)
                ->drawText('Hasta', 40, 755)
                ->drawText(':', 83, 785)
                ->drawText(':', 83, 770)
                ->drawText(':', 83, 755);

        $page->setFont($font, 10)
                ->drawText("$nombreProfesor", 90, 785, 'UTF-8')
                ->drawText("$desde", 90, 770)
                ->drawText("$hasta", 90, 755);

        $page->setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0))
                ->drawLine(40, 745, ($page->getWidth() - 40), 745)
                ->drawLine(40, 732, ($page->getWidth() - 40), 732);

        $page->setFont($font, 10)
                ->drawText('Fecha', 40, 735)
                ->drawText('Di�a', 110, 735, 'UTF-8')
                ->drawText('Entrada', 170, 735)
                ->drawText('Salida', 230, 735)
                ->drawText('Observacion', 290, 735, 'UTF-8');

        //Agregar pagina al pdf
        $pdf->pages[] = $page;

        $currentPage = 1;
        $yPoint = 710;

        foreach ($dataSet as $row) {
            //Salto de pagina
            if ($yPoint < 90) {
                //Nueva pagina
                $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4); //'595:842:'
                //Agregar pagina al pdf
                $pdf->pages[] = $page;
                $yPoint = 800;
                $currentPage++;
            }
            //Encabezado para cualquier pagina que no sea la primera
            if ($currentPage > 1 && $yPoint == 800) {

                $page->setLineColor(new \Zend_Pdf_Color_Rgb(0, 0, 0))
                        ->drawLine(40, 795, ($page->getWidth() - 40), 795)
                        ->drawLine(40, 782, ($page->getWidth() - 40), 782);

                $page->setFont($font, 10)
                        ->drawText('Fecha', 40, 785)
                        ->drawText('D�a', 110, 785, 'UTF-8')
                        ->drawText('Entrada', 170, 785)
                        ->drawText('Salida', 230, 785)
                        ->drawText('Observacion', 290, 785, 'UTF-8');

                $yPoint = 770;
            }

            
            $fecha = $row['fecha']->format('d/m/Y');
            if (!$row['entrada'])
                $horaEntrada = '- -  - -  - -';
            else
                $horaEntrada = $row['entrada'];
            if (!$row['salida'])
                $horaSalida = '- -  - -  - -';
            else
                $horaSalida = $row['salida'];
            switch ($row['dia']) {
                case 1:
                    $dia = 'Lunes';
                    break;
                case 2:
                    $dia = 'Martes';
                    break;
                case 3:
                    $dia = 'Miercoles';
                    break;
                case 4:
                    $dia = 'Jueves';
                    break;
                case 5:
                    $dia = 'Viernes';
                    break;
                case 6:
                    $dia = 'S�bado';
                    break;
                case 7:
                    $dia = 'Domingo';
                    break;
                default:
                    $dia = 'ERROR';
            }

            $page->setFont($font, 10)
                    ->drawText($fecha, 40, $yPoint)
                    ->drawText($dia, 110, $yPoint, 'UTF-8')
                    ->drawText($horaEntrada, 170, $yPoint)
                    ->drawText($horaSalida, 230, $yPoint)
                    ->drawText($row['obs'], 290, $yPoint);

            $yPoint = $yPoint - 15;
        }

        if ($yPoint < 90) {
            //Nueva pagina
            $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4); //'595:842:'
            //Agregar pagina al pdf
            $pdf->pages[] = $page;
            $yPoint = 800;
            $currentPage++;
        }

        //Numerar paginas
        $pageNumber = 1;
        foreach ($pdf->pages as $p) {
            $p->drawText($pageNumber++, 550, 40);
        }

        // Guardar el pdf
        $fileName = 'ListadoMarcaciones.pdf';
        $pdf->save($fileName);

        X\Msg::Success('El reporte se ha generado con Exito.');
    }

    public function pdfAction() {

        $pdf = Zend_Pdf::load('ListadoMarcaciones.pdf');

        $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
        $this->getResponse()->setHeader('Content-disposition', "filename=ListadoMarcaciones.pdf", true);
        $this->getResponse()->setBody($pdf->render());
    }

}
